High-performance networking is continually faced with a challenge: local networking technologies are getting faster more quickly than processor and memory speeds. Every time that Ethernet technology provides another speed increment, networking developers must find ways to enable the rest of the system to keep up—even on fast contemporary hardware.
Networking devices typically utilize a buffer, i.e., a region of memory that temporarily stores data in the networking device, to compensate for congestion at an incoming (or outgoing) port on a concentrator, multiplexer, switch, router, etc. If, for example, the level of incoming traffic exceeds the resources of a switch, a buffer at the incoming switch port can temporarily store the excess traffic until the switch has sufficient resources to process the traffic. A buffer can also serve to store packet data temporarily to allow retransmission in the event that a downstream device does not receive the packet without error within an acceptable period of time.
Network interface hardware of a receiving computer system typically receives packets into a buffer before the packet contents are written to system memory. As processing overhead becomes significant, to reduce the chance of buffer overflow, packets in the buffer may be sent to one or more offload engines for processing and writing into memory. The one or more offload engines often provide features such as parsing packet headers, checksum calculations, header separation, and scatter-gather storing of the packets.
Multiple offload engines may be employed to concurrently handle packets from different logical ports, threads, or other connections. In such a system, packet processing may be referred to as “multi-threaded.”